package client.service;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.Scanner;

/**
 * 客户端数据处理器
 */
public class TimeClientHandler extends ChannelInboundHandlerAdapter {
    /**
     * 当客户端和服务端 TCP 链路建立成功之后，Netty 的 NIO 线程会调用 channelActive 方法
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        //定义向服务端的请求消息
        String reqMsg = "我是客户端 , 线程名: " + Thread.currentThread().getName();
        byte[] reqMsgByte = reqMsg.getBytes("UTF-8");
        ByteBuf reqByteBuf = Unpooled.buffer(reqMsgByte.length);
        /**
         * writeBytes：将指定的源数组的数据传输到缓冲区
         * 调用 ChannelHandlerContext 的 writeAndFlush 方法将消息发送给服务器
         */
        reqByteBuf.writeBytes(reqMsgByte);
        //写 并推送
        // todo :  注意   用 ChannelInboundHandlerAdapter 时 传输的是ByteBuf类型数据, 如果是其他类型可能接不到数据
        ctx.writeAndFlush(reqByteBuf);
    }

    /**
     * 当服务端返回应答消息时，channelRead 方法被调用，从 Netty 的 ByteBuf 中读取并打印应答消息
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf buf = (ByteBuf) msg;
        byte[] req = new byte[buf.readableBytes()];
        buf.readBytes(req);
        String body = new String(req, "UTF-8");
        System.out.println("服务端返回消息  ：" + body + "\n   接收的线程名: " + Thread.currentThread().getName());

        // 这里也可以写 并推送  但是这样会导致  客户端与服务端的死循环
        String response = "客户端向服务端请求";
        ByteBuf byteBuf = Unpooled.copiedBuffer(response.getBytes());
        ctx.writeAndFlush(byteBuf);
    }

    /**
     * 当发生异常时，打印异常 日志，释放客户端资源
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        /**释放资源*/
        System.out.println("客户端请求服务端出现异常:" + cause.getMessage());
        ctx.close();
    }
//
//    @Override
//    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
//        System.out.println("推送数据");
//        ByteBuf reqByteBuf = Unpooled.copiedBuffer(new String("hello").getBytes());
//        ctx.writeAndFlush(reqByteBuf);
////        super.channelReadComplete(ctx);
//    }
}
